package studentinformationmanagementsystem.service.impl;

import studentinformationmanagementsystem.dao.*;
import studentinformationmanagementsystem.dao.impl.*;
import studentinformationmanagementsystem.entity.*;
import studentinformationmanagementsystem.service.TakeACourseService;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * @author 苗庆
 * @version 1.0
 */
public class TakeACourseServiceImpl implements TakeACourseService {

         TakeACourseDao takeACourseDao=new TakeACoureDaolmpl();
         TemporaryClassTableDao temporaryClassTableDao=new TemporaryClassTableDaolmpl();
         TeachersSchedulesDao teachersSchedulesDao=new TeachersSchedulesDaolmpl();
         TeacherDao teacherDao=new TeacherDaoImpl();
         CourseDao courseDao=new CourseDaolmpl();
    /**
     *展示学生个人的所有选课信息
     * @param student
     * @return
     *
     *
     * 业务逻辑思路
     * 1.先使用学生id去选修课表中查询学生个人的选修课信息
     * 2.从选修课表中拿出选修课班级临时表id
     * 3.使用获得的选修课班级临时表id,查询临时班级表，将获取到的教师任课表id取出，然后去教师任课表中获取对应的教师id和课程id。
     * 4.使用教师id，在教师表中获取教师姓名，将教师姓名添加到Tacshow对象的teachername变量当中去。
     * 5.使用课程id，在课程表中获取课程编号、课程名称、课程学分、课程学时、并且将其依次添加到Tacshow对象的number、coursename、coursecredit、period当前中去
     * 6.将Tacshow对象放入到list表中去
     * 7.将list返回。
     */
    @Override
    public List<TacShow> lookCourse(Student student) {
        //用来装封装的TacShow对象
        List<TacShow> tacShows = new ArrayList<>();

         //1.先使用学生id去选修课表中查询学生个人的选修课信息
        TakeACourse takeACourse = new TakeACourse();
        //将学生表id赋值给选修课对象
        takeACourse.setStudid(student.getStudid());
        //查询这个学生个人的所有选修课信息
        List<TakeACourse> takeACourses = takeACourseDao.queryBystudidC(takeACourse);

        if (takeACourses.size()!=0){
            for (int i = 0; i <takeACourses.size() ; i++) {
                TakeACourse takeACourse1 = takeACourses.get(i);
                TacShow tacShow = new TacShow();


                //2.从选修课表中拿出选修课班级临时表id
                TemporaryClassTable temporaryClassTable = new TemporaryClassTable();
                temporaryClassTable.setTemporaryclasstableid(takeACourse1.getTemporaryclasstableid());

                //3.使用获得的选修课班级临时表id,查询临时班级表，将获取到的教师任课表id取出，然后去教师任课表中获取对应的教师id和课程id。
                TemporaryClassTable temporaryClassTable1 = temporaryClassTableDao.queryById(temporaryClassTable);

                //获取教师任课表id
                TeachersSchedules teachersSchedules = new TeachersSchedules();
                teachersSchedules.setTeachersschedulesid(temporaryClassTable1.getTeachersschedulesid());

                //使用教师任课表id获取教师id和课程id
                TeachersSchedules teachersSchedules1 = teachersSchedulesDao.queryById(teachersSchedules);

                //获取教师id
                Teacher teacher = new Teacher();
                teacher.setTeacherid(teachersSchedules1.getTeacherid());
                //获取课程id
                Course course = new Course();
                course.setCourseid(teachersSchedules1.getCourseid());

                //4.使用教师id，在教师表中获取教师姓名，将教师姓名添加到Tacshow对象的teachername变量当中去。
                Teacher teacher1 = teacherDao.queryById(teacher);
                tacShow.setTeachername(teacher1.getTeachername());

                //5.使用课程id，在课程表中获取课程编号、课程名称、课程学分、课程学时、
                // 并且将其依次添加到Tacshow对象的number、coursename、coursecredit、period当前中去
                Course course1 = courseDao.queryById(course);
                tacShow.setNumber(course1.getNumber());
                tacShow.setCoursename(course1.getCoursename());
                tacShow.setCoursecredit(course1.getCoursecredit());
                tacShow.setPeriod(course1.getPeriod());

                //6.将Tacshow对象放入到list表中去
                tacShows.add(tacShow);
            }


        }
        //7.将list返回。
        return tacShows;
    }


    /**
     * 学生选课
     * @param number  课程编号
     * @param student  学生个人对象
     * @return
     * 业务逻辑思路
     * 1.使用学生对象，把学生表id拿出放入TakeACourse对象的studid变量中去
     * 2.使用课程编号去查询课程信息，拿到课程id。
     * 3.使用课程id去教师任课表查询教师任课表id。
     * 4.使用教师任课表id去选课临时班级表查询选课临时班级表id。
     * 5.拿到选课临时班级表id后放入TakeACourse对象的temporaryclasstableid变量中去
     * 6.将学生选课的初始成绩设置为0,添加到TakeACourse对象的achievement变量
     * 7.使用选课临时班级表id加学生表id去选课表查询，是否可以查询到记录，如果查询到记录说明重复选择了课程，则直接返回不做添加学生选课操作
     * 8.判断当前的选课人数是否已经满了，如果人数满了那么就无法再进行选课
     * 8.没有记录再调用dao层的添加学生选课表记录方法
     * 9.判断添加是否成功
     */
    @Override
    public Map<String, String> isAddCourse(String number, Student student) {


          boolean falg=false; //用来判断当前选择的课程是否已经存在

        //定义个map用来装返回给上一级的判断信息
        Map<String,String> map=new HashMap<>();




        TakeACourse takeACourse = new TakeACourse();
        //1.使用学生对象，把学生表id拿出放入TakeACourse对象的studid变量中去
        takeACourse.setStudid(student.getStudid());

        //2.使用课程编号去查询课程信息，拿到课程id。
        Course course = new Course();
        course.setNumber(number);
        Course course1 = courseDao.queryByNumber(course);
        TeachersSchedules teachersSchedules = new TeachersSchedules();
        teachersSchedules.setCourseid(course1.getCourseid());


        //3.使用课程id去教师任课表查询教师任课表id。
        TeachersSchedules teachersSchedules1 = teachersSchedulesDao.queryBycourseid(teachersSchedules);
        TemporaryClassTable temporaryClassTable = new TemporaryClassTable();
        //临时班级选课表获得了教师任课表的id
        temporaryClassTable.setTeachersschedulesid(teachersSchedules1.getTeachersschedulesid());

        //4.使用教师任课表id去选课临时班级表查询选课临时班级表id。
        TemporaryClassTable temporaryClassTable1 = temporaryClassTableDao.queryByTeachersschedulesid(temporaryClassTable);

        //5.拿到选课临时班级表id后放入TakeACourse对象的temporaryclasstableid变量中去
        takeACourse.setTemporaryclasstableid(temporaryClassTable1.getTemporaryclasstableid());

        //6.将学生选课的初始成绩设置为0,添加到TakeACourse对象的achievement变量
        takeACourse.setAchievement("0");

        //7.使用选课临时班级表id加学生表id去选课表查询，是否可以查询到记录，如果查询到记录说明重复选择了课程，则直接返回不做添加学生选课操作
        TakeACourse takeACourse1 = takeACourseDao.queryBytemporaryclasstableidAndstudid(takeACourse);


        //8.判断当前的选课人数是否已经满了，如果人数满了那么就无法再进行选课
        //使用临时选课表的id去查询这门课现在有多少同学选了

        TakeACourse takeACourse2 = new TakeACourse();
        takeACourse2.setTemporaryclasstableid(temporaryClassTable1.getTemporaryclasstableid());
        List<TakeACourse> takeACourses = takeACourseDao.queryBytemporaryclasstableId(takeACourse2);
        //获取课程已经被多少学生选择了
        int size = takeACourses.size();


        //获取这门课的限制人数
        Integer numberofpeople = temporaryClassTable1.getNumberofpeople();



        if (size>=numberofpeople){
            map.put("code","3");   //"所选课程已经人数已满无法再选"
            return map;
        }


        if(takeACourse1!=null){
            map.put("code","0");   //"所选课程已经选过，无法重新选择，选课失败"
            return map;
        }else {
            //9.没有记录再调用dao层的添加学生选课表记录方法
            int insert = takeACourseDao.insert(takeACourse);

            //10.判断添加是否成功
            if (insert>=1){  //选课成功
                falg=true;
                map.put("code","1");   //"选课成功"
                return map;
            }else {
                map.put("code","2");   //"选课失败失败"
                return map;
            }
        }
    }


    /**
     * 学生退课
     * @param number  课程编号
     * @param student  学生个人对象
     * @return
     * 业务逻辑思路
     * 1.使用学生对象，把学生表id拿出放入TakeACourse对象的studid变量中去
     * 2.使用课程编号去查询课程信息，拿到课程id。
     * 3.使用课程id去教师任课表查询教师任课表id。
     * 4.使用教师任课表id去选课临时班级表查询选课临时班级表id。
     * 5.拿到选课临时班级表id后放入TakeACourse对象的temporaryclasstableid变量中去
     * 6.使用选课临时班级表id加学生表id去选课表查询选课信息。
     * 7。使用查询到的选课表记录的选课表id使用dao的按照学生选课id删除这条记录
     * 8.判断是否删除成功并且返回信息。
     */
    @Override
    public boolean isDeleteCourse(String number, Student student) {
        boolean falg=false; //判断是否退课成功


        TakeACourse takeACourse = new TakeACourse();
        //1.使用学生对象，把学生表id拿出放入TakeACourse对象的studid变量中去
        takeACourse.setStudid(student.getStudid());

        //2.使用课程编号去查询课程信息，拿到课程id。
        Course course = new Course();
        course.setNumber(number);
        Course course1 = courseDao.queryByNumber(course);
        TeachersSchedules teachersSchedules = new TeachersSchedules();
        teachersSchedules.setCourseid(course1.getCourseid());


        //3.使用课程id去教师任课表查询教师任课表id。
        TeachersSchedules teachersSchedules1 = teachersSchedulesDao.queryBycourseid(teachersSchedules);
        TemporaryClassTable temporaryClassTable = new TemporaryClassTable();
        //临时班级选课表获得了教师任课表的id
        temporaryClassTable.setTeachersschedulesid(teachersSchedules1.getTeachersschedulesid());

        //4.使用教师任课表id去选课临时班级表查询选课临时班级表id。
        TemporaryClassTable temporaryClassTable1 = temporaryClassTableDao.queryByTeachersschedulesid(temporaryClassTable);

        //5.拿到选课临时班级表id后放入TakeACourse对象的temporaryclasstableid变量中去
        takeACourse.setTemporaryclasstableid(temporaryClassTable1.getTemporaryclasstableid());


        //6.使用选课临时班级表id加学生表id去选课表查询选课信息。
        TakeACourse takeACourse1 = takeACourseDao.queryBytemporaryclasstableidAndstudid(takeACourse);

        //7。使用查询到的选课表记录的选课表id使用dao的按照学生选课id删除这条记录
        int delete = takeACourseDao.delete(takeACourse1);

        //8.判断是否删除成功并且返回信息。
        if (delete>=1){
            falg=true;
        }

        return falg;
    }
}
